package com.linkgie.galaxyframework.metadata;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 数据组合类型；
 * <p>
 * 
 * 数据组合类型 {@link DataComposite} 属于 {@link ContentType} 的一种，标注的字段将生成“组合”类型的内容类型 {@link ContentType.Composite#TYPE}；
 * <p>
 * 
 * {@link DataComposite} 用于对实体类型(标注{@link DataEntity}的类型)中的字段进行标注，并且该字段的类型必须是对象类型（或者对象类型数组），不能是单值类型；<p>
 * 
 * 逻辑上而言，字段的类型应该表现为 {@link #model()} 参数指定类型的属性子集，或者是其父类（注：继承关系是更严格的约束关系），<br>
 * 
 * 但是框架并不会严格限制其必须是父子继承关系，目的是提供更多灵活性。应注意的是，如果字段类型和数据模型的类型毫无关系，在应用上是毫无意义的。Ï
 * 
 * <p>
 * 
 * @author huanghaiquan
 *
 */
@Target({ ElementType.FIELD, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataComposite {

	/**
	 * 组合模型；<p>
	 * 
	 * 表示要组合的数据实体的类型；指定的类型必须标注了 {@link DataEntity} ；<p>
	 * 
	 * 采用此标注的字段的类型必须是对象（不能是单值类型）；<p>
	 * 
	 * @return
	 */
	Class<?> model() default void.class;

	/**
	 * 组合以 {@link DataInterface} 标注的数据接口；<p>
	 * 
	 * 该接口被模型({@link #model()})实现，表达的含义是引用数据模型中的由接口声明的一部分字段的子集；<p>
	 * 
	 * 注： interfase 等同于 interface ，为了规避Java语言关键字而将字母 c 替换为 s ；
	 * 
	 * @return
	 */
	Class<?> interfase() default void.class;
	
	/**
	 * 组合的数据范围的查询条件接口；<p>
	 * 
	 * 查询条件接口表达的含义是指定引用数据模型中的一组字段作为查询的维度；
	 * 
	 * @return
	 */
	Class<?> conditionInterface() default void.class;
	
	/**
	 * 组合的数据模型中作为字面文字的字段；<p>
	 * 
	 * @return
	 */
	String labelKey() default "";
	
	
//	/**
//	 * 组合的数据模型的下一级级联字段；<p>
//	 * 
//	 * 表示在组合的数据模型中，用于此级联关系进一步级联延伸到下一级的字段；<p>
//	 * 
//	 * 典型的例子便是“树状”的数据结构；<p>
//	 * 
//	 * 在组合的数据模型中，一个字段需要满足以下条件之一，才能作为级联字段：<br>
//	 * 1. 字段的数据类型是对象类型（{@link StandardType#OBJECT}），具体类型为自身的数据模型；<br>
//	 * 2. 字段的数据类型是单值类型，但标注了引用({@link DataReference})或组合({@link DataComposite})或聚（ {@link DataAggregate} 的数据模型为自身的数据模型；
//	 * 
//	 * <p>
//	 * 
//	 * 为数据组合指定级联字段，可以提供层级化展开待选择对象的能力；<p>
//	 * 
//	 * 
//	 * @return
//	 */
//	String cascadeKey() default "";
}
